﻿using System;
using System.Collections;
using System.Linq;
using System.Web;
using System.Text;
using System.IO;
using System.Data.SqlClient;
using System.Data;
using Tibet.Datos;
using Tibet.Entidades;


namespace Tibet.Logica
{
    public class Parser
    {
        static private ArrayList Parsear(string ruta)
        {
            StreamReader objReader = new StreamReader(ruta);
            string sLine = "";
            ArrayList arrText = new ArrayList();
            while (sLine != null)
            {
                sLine = objReader.ReadLine();
                if (sLine != null)
                    arrText.Add(sLine);
            }
            objReader.Close();
            return arrText;
        }

        private static Conexion InstanciarConexion()
        {
            Conexion nueva = new Conexion();
            return (nueva);
        }

        public static Resultado ValidaArchivo(string ruta, int idproyecto, int lider)
        {
            ArrayList archivo = Parsear(ruta);//crea perfil y se llena con lo que este en la base de datos
            PerfilRegla perfil = new PerfilRegla();
            perfil = PerfilReglasProyecto.buscarReglas(idproyecto);
            Regla regla;
            Resultado Result = new Resultado();
            for (int i = 0; i == perfil.nombreRegla.Count; i++)
            {
                if (perfil.nombreRegla[i].Equals("ParentesisCEF"))
                {
                    regla = new LogicaReglaParentesis(1);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ParentesisSE"))
                {
                    regla = new LogicaReglaParentesis(2);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ParentesisEX"))
                {
                    regla = new LogicaReglaParentesis(3);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ParentesisIN"))
                {
                    regla = new LogicaReglaParentesis(4);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ConEspacio"))
                {
                    regla = new LogicaReglaOperadores(1);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("SinEspacio"))
                {
                    regla = new LogicaReglaOperadores(2);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("Mayuscula_NoUnderscore"))
                {
                    regla = new LogicaReglaNombrarClases(1);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("Mayuscula_SiUnderscore"))
                {
                    regla = new LogicaReglaNombrarClases(2);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("Minuscula_NoUnderscore"))
                {
                    regla = new LogicaReglaNombrarClases(3);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("Minuscula_SiUnderscore"))
                {
                    regla = new LogicaReglaNombrarClases(4);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("regla_LlavesSolas"))
                {
                    regla = new LogicaReglaLLaves(1);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("regla_LlavesJuntas"))
                {
                    regla = new LogicaReglaLLaves(2);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("regla_LlavesCompJS"))
                {
                    regla = new LogicaReglaLLaves(3);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("regla_LlavesCompSJ"))
                {
                    regla = new LogicaReglaLLaves(4);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ComentarClase"))
                {
                    regla = new LogicaReglaDocumentacion(2);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ComentarEstructura"))
                {
                    regla = new LogicaReglaDocumentacion(1);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ComentarBoilerPlate"))
                {
                    regla = new LogicaReglaDocumentacion(3);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla[i].Equals("ComentarMetodo"))
                {
                    regla = new LogicaReglaDocumentacion(4);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla.Equals("AtributoMayuscula"))
                {
                    regla = new LogicaValidarAtributo(1);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla.Equals("AtributoMinuscula"))
                {
                    regla = new LogicaValidarAtributo(2);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla.Equals("MetodoM"))
                {
                    regla = new LogicaValidarMetodo(1);
                    perfil.listaRegla.Add(regla);
                }
                else if (perfil.nombreRegla.Equals("MetodoN"))
                {
                    regla = new LogicaValidarMetodo(2);
                    perfil.listaRegla.Add(regla);
                }
            }
            for (int i = 0; i == perfil.listaRegla.Count; i++)
            {
                regla = (Regla)perfil.listaRegla[i];
                Result = regla.Aplicar(archivo);
                if (Result.Respuesta == true)
                {
                    InsertarResultado insertar = new InsertarResultado();
                    insertar.Insertar(Result, ruta, lider, (int)perfil.idRegla[i]);
                    return Result;
                }
            }
            return Result;
        }

    }
}